#ifndef LOG_SINK_BASESINK_H_
#define LOG_SINK_BASESINK_H_

#include <fermat/log/sink/sink.h>
#include <fermat/log/log_formatter.h>
#include <fermat/log/log_common.h>
#include <fermat/log/detail/log_msg.h>
#include <fermat/common/mutex.h>
#include <fermat/common/scoped_lock.h>

namespace fermat {
namespace log {
template<class Mutex>
class base_sink:public sink {
public:
    base_sink():_mutex() {}
    virtual ~base_sink() {};

    void log(const log_msg& msg) 
    {
        fermat::ScopedLock<Mutex>  lock(&_mutex);
        _sink_it(msg);
    }

protected:
    virtual void _sink_it(const log_msg& msg) = 0;
    Mutex _mutex;
private:
    base_sink(const base_sink&);
    base_sink& operator=(const base_sink&);

};
}
}
#endif